package beans;


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TimeZone;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import org.icefaces.ace.component.fileentry.FileEntryResults;
import org.icefaces.ace.component.fileentry.FileEntryResults.FileInfo;

import com.icesoft.faces.component.selectinputtext.TextChangeEvent;

import pojo.Evento;
import pojo.Luogo;
import pojo.Testo;
import util.Utility;


@ManagedBean(name="gestioneBean")
@SessionScoped
public class GestioneBean implements Serializable{

	@ManagedProperty(value="#{connectionBean}")
	private ConnectionBean connectionBean;
	@ManagedProperty(value="#{messaggioBean}")
	private MessaggioBean messaggioBean;
	private Evento ev = null;
	private  final String DATE_PATTERN = "dd-MM-yyyy HH:mm";
	private  final String HOUR_PATTERN = "HH:mm";
    private Luogo luogo = null;
    private Testo slider = null;
    private FileEntryResults fotoEv;
    private FileEntryResults fotoSlider;
	private FileEntryResults fotoLuogo;
	private SelectItem[]tipiLuoghi = null;
	private SelectItem[]tipiEventi = null;
	private String seleziona = "Seleziona";
	private List<SelectItem> availableLuoghi;
    private String selectedText = null; // Text the user is typing in
    private TimeZone timeZone = TimeZone.getTimeZone("Europe/Berlin");
  


	public GestioneBean() {
		ev = new Evento();
		luogo = new Luogo();
		slider = new Testo();
		setAvailableLuoghi(new ArrayList<SelectItem>());
	}


	public ConnectionBean getConnectionBean()
    {
        return connectionBean;
    }

    public void setConnectionBean(ConnectionBean conn)
    {
        this.connectionBean = conn;
    }
    public SelectItem[] getTipiLuoghi() {

		if(tipiLuoghi!=null)
			return tipiLuoghi;
	
		else{
			
			ConnectionBean connec = getConnectionBean();
			List tips = connec.doQueryTipiSaxon("luogo");
			if(tips!=null){
				tipiLuoghi = new SelectItem[tips.size()];
				int i =0;
				for(Iterator it = tips.iterator();it.hasNext();){
					String tipo =  (String)it.next();
					SelectItem nuovo = new SelectItem(tipo,tipo);
					tipiLuoghi[i]= nuovo;
					i++;
				}
				
			}else{
				tipiLuoghi = new SelectItem[1];
				tipiLuoghi[0] = new SelectItem(getSeleziona(),getSeleziona());
			}
			
			return tipiLuoghi;
			
		}
	}
    
    public SelectItem[] getTipiEventi() {

		if(tipiEventi!=null)
			return tipiEventi;
	
		else{
			
			ConnectionBean connec = getConnectionBean();
			List tips = connec.doQueryTipiSaxon("evento");
			int i=0;
			if(tips!=null){
				tipiEventi = new SelectItem[tips.size()];
				for(Iterator it = tips.iterator();it.hasNext();){
					String tipo =  (String)it.next();
					SelectItem nuovo = new SelectItem(tipo,tipo);
					tipiEventi[i]= nuovo;
					i++;
				}
				
			}else{
				tipiEventi = new SelectItem[1];
				tipiEventi[0] = new SelectItem(getSeleziona(),getSeleziona());
			}
			
			return tipiEventi;
			
		}
	}
    
	public void onChangeTipoLuogo(ValueChangeEvent evnt) {
        
 		//System.out.println(evnt.getOldValue());
 		//System.out.println(evnt.getNewValue());
 		
 
 	} 
	
	public void onChangeTipoEvento(ValueChangeEvent evnt) {
        
 		//System.out.println(evnt.getOldValue());
 		//System.out.println(evnt.getNewValue());
 		
 
 	} 
	
	public void onChangeGiornoEvento(ValueChangeEvent evnt) {
        
 		//System.out.println(evnt.getOldValue());
 		//System.out.println(evnt.getNewValue());
 		
 
 	} 
    
    public String doInsEvento(){
    	
    	//System.out.println(ev.getDescrizione());
    	if (fotoEv!=null){
    		Iterator it = fotoEv.getFiles().iterator();
    		if(it.hasNext()){
    			FileInfo inf = (FileInfo)it.next();
    			System.out.println(inf.getFileName());
    			ev.setFoto(inf.getFileName());
    		}
    	}
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.ADD,ev);
    	
    	
    	
    	//alla fine azzeriamo oggetto 
    	ev = new Evento();
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Evento insertito correttamente");
    	return "";
    	
    }
    
   /*
    public String doInsFoto(){
    	
    	
    	insFoto=false;
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Foto Inserite");

    	return "";
    	
    }
 */
    public String doModEvento(){
    	
    	//System.out.println(ev.getDescrizione());
    	if (fotoEv!=null){
    		Iterator it = fotoEv.getFiles().iterator();
    		if(it.hasNext()){
    			FileInfo inf = (FileInfo)it.next();
    			//System.out.println(inf.getFileName());
    			ev.setFoto(inf.getFileName());
    		}
    	}
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.MOD,ev);
    	
    	
    	
    	//alla fine azzeriamo oggetto 
    	ev = new Evento();
    	//gestEventi = false;
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Evento modificato correttamente");
    	return "gestEventi?faces-redirect=true";
    	
    }
  public String doModSlider(){
    	
    	//System.out.println(ev.getDescrizione());
    	if (fotoSlider!=null){
    		Iterator it = fotoSlider.getFiles().iterator();
    		if(it.hasNext()){
    			FileInfo inf = (FileInfo)it.next();
    			//System.out.println(inf.getFileName());
    			slider.setUrl(inf.getFileName());
    		}
    	}
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.MOD,slider);
    	
    	
    	
    	//alla fine azzeriamo oggetto 
    	slider = new Testo();
    	//gestEventi = false;
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Slider modificato correttamente");
    	return "gestione?faces-redirect=true";
    	
    }
    
    public String doModLuogo(){
    	
    	//System.out.println(ev.getDescrizione());
    	if (fotoLuogo!=null){
    		Iterator it = fotoLuogo.getFiles().iterator();
    		if(it.hasNext()){
    			FileInfo inf = (FileInfo)it.next();
    			//System.out.println(inf.getFileName());
    			luogo.setFoto(inf.getFileName());
    		}
    	}
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.MOD,luogo);
    	
    	
    	
    	//alla fine azzeriamo oggetto 
    	luogo = new Luogo();
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Luogo modificato correttamente");
    	return "gestLuoghi?faces-redirect=true";
    	
    }
    
    public String getStringaEventi(){   	
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();

    	return 	connec.getEventiSaxon();
    	
    }
    public String getStringaLuoghi(){   	
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();

    	return 	connec.getLuoghiSaxon();
    	
    }  
    
    public String doCancEv(){   	
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.DEL,ev);
    		
    	//alla fine azzeriamo oggetto 
    	ev = new Evento();
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Evento cancellato correttamente");
    	return "gestEventi?faces-redirect=true";
    	
    }    
    public String doCancLuogo(){   	
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.DEL,luogo);
    	
    	//alla fine azzeriamo oggetto 
    	luogo = new Luogo();
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Luogo cancellato correttamente");
    	return "gestLuoghi?faces-redirect=true";
    	
    } 
    public String doInsLuogo(){
    	
    	//System.out.println(ev.getDescrizione());
    	if (fotoLuogo!=null){
    		Iterator it = fotoLuogo.getFiles().iterator();
    		if(it.hasNext()){
    			FileInfo inf = (FileInfo)it.next();
    			//System.out.println(inf.getFileName());
    			luogo.setFoto(inf.getFileName());
    		}
    	}
    	
    	//procedi all inserimento con transaction
		ConnectionBean connec = getConnectionBean();
		 connec.update(Utility.ADD,luogo);
    	
    	
    	
    	//alla fine azzeriamo oggetto 
    	luogo = new Luogo();
		MessaggioBean er  = getMessaggioBean();
		er.setMessaggio("Luogo insertito correttamente");
    	return "";
    	
    }
	public List getEventi() {
		
	
		ConnectionBean connec = getConnectionBean();
		return connec.doQueryEventiSaxon(null,null,null);

	}
	public List getSliders() {
		
		
		ConnectionBean connec = getConnectionBean();
		return connec.doQuerySliderSaxon();

	}
	public List getLuoghi() {
		
		
		ConnectionBean connec = getConnectionBean();
		return connec.doQueryLuoghiSaxon(null,null);

	}
	public void modEvListener(ActionEvent ev){
		
    	Map<String, Object>attrs= ev.getComponent().getAttributes();
    	Evento id = (Evento) attrs.get("ident");
    	setEv(id);
		
	}
	public void modSliderListener(ActionEvent ev){
		
    	Map<String, Object>attrs= ev.getComponent().getAttributes();
    	Testo id = (Testo) attrs.get("ident");
    	setSlider(id);
		
	}
	public void modLuogoListener(ActionEvent ev){
		
    	Map<String, Object>attrs= ev.getComponent().getAttributes();
    	Luogo id = (Luogo) attrs.get("luogo");
    	setLuogo(id);
		
	}
    public Evento getEv() {
		return ev;
	}


	public void setEv(Evento ev) {
		this.ev = ev;
	}


	public Luogo getLuogo() {
		return luogo;
	}

    public Testo getSlider() {
		return slider;
	}


	public void setSlider(Testo slider) {
		this.slider = slider;
	}


	public void setLuogo(Luogo luogo) {
		this.luogo = luogo;
	}


  
    public void salvaModEv(){
	
	
	
}
    public FileEntryResults getFotoEv() {
		return fotoEv;
	}

	public void setFotoEv(FileEntryResults fotoEv) {
		this.fotoEv = fotoEv;
	}
	public FileEntryResults getFotoLuogo() {
		return fotoLuogo;
	}

	public void setFotoLuogo(FileEntryResults fotoLuogo) {
		this.fotoLuogo = fotoLuogo;
	}
 
	public MessaggioBean getMessaggioBean() {
		return messaggioBean;
	}

	public void setMessaggioBean(MessaggioBean messaggioBean) {
		this.messaggioBean = messaggioBean;
	}
    public FileEntryResults getFotoSlider() {
		return fotoSlider;
	}


	public void setFotoSlider(FileEntryResults fotoSlider) {
		this.fotoSlider = fotoSlider;
	}


	public String getDATE_PATTERN() {
		return DATE_PATTERN;
	}

	public String getSeleziona() {
		return seleziona;
	}


	public void setSeleziona(String seleziona) {
		this.seleziona = seleziona;
	}


	public String getHOUR_PATTERN() {
		return HOUR_PATTERN;
	}


	public List<SelectItem> getAvailableLuoghi() {
		return availableLuoghi;
	}


	public void setAvailableLuoghi(List<SelectItem> availableLuoghi) {
		this.availableLuoghi = availableLuoghi;
	}



	public String getSelectedText() {
		return selectedText;
	}


	public void setSelectedText(String selectedText) {
		this.selectedText = selectedText;
	}
    public void luogoChanged(TextChangeEvent event) {
      
    	ConnectionBean connec = getConnectionBean();
    	availableLuoghi = connec.getLuoghiAutocomplete(event.getNewValue().toString());
    	ev.setNomeLuogo(event.getNewValue().toString());
    }
    public void submitLuogo(ActionEvent event) {
        
    	String selLuogo = getSelectedText();
    	//System.out.println();
    	StringTokenizer tok = new StringTokenizer(selLuogo,"-");
    	//Esiste il luogo!
    	if(tok.countTokens()==3){
    		ev.setNomeLuogo(tok.nextToken().trim());
    		tok.nextToken();
    		ev.setIdLuogo(tok.nextToken().trim());
    	}else
    		ev.setIdLuogo("");
        // Clear out filtered list now that we have made a choice
        availableLuoghi = null;
    }


	public TimeZone getTimeZone() {
		return timeZone;
	}


	public void setTimeZone(TimeZone timeZone) {
		this.timeZone = timeZone;
	}
}
